package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.mapper.AttributeTemplateMapper;
import cn.tedu.csmall.product.mapper.CategoryAttributeTemplateMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeTemplateUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Album;
import cn.tedu.csmall.product.pojo.entity.AttributeTemplate;
import cn.tedu.csmall.product.pojo.vo.AlbumStandardVO;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateListVO;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateStandardVO;
import cn.tedu.csmall.product.service.IAttributeTemplateService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service        //todo   brand的api文档参数设置还未完成
public class AttributeTemplateServiceImpl implements IAttributeTemplateService {
    @Autowired
    AttributeTemplateMapper attributeTemplateMapper;
    @Autowired
    AttributeMapper attributeMapper;
    @Autowired
    CategoryAttributeTemplateMapper categoryAttributeTemplateMapper;

    @Override
    public void delete(Long id) {
        log.debug("开始处理[根据id删除属性模板]的业务,参数{}",id);
        AttributeTemplateStandardVO queryResult = attributeTemplateMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除失败,尝试访问的数据不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("判断属性模板是否有关联的属性");
        int i = attributeMapper.countByTemplateId(id);
        if (i>0) {
            String message = "此属性模板有关联的属性,不能删除";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        log.debug("判断属性模板是否有关联的类别数据");
        i = categoryAttributeTemplateMapper.countByAttributeTemplateId(id);
        if (i>0) {
            String message = "此属性模板有关联的类别数据,不能删除";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        log.debug("即将执行删除,参数{}",id);
        attributeTemplateMapper.deleteById(id);

        log.debug("删除完成");
    }

    @Override
    public void updateById(AttributeTemplateUpdateDTO attributeTemplateUpdateDTO) {
        log.debug("开始处理[根据id修改属性模板业务], 参数:{}",attributeTemplateUpdateDTO);
        //查询属性模板是否存在
        AttributeTemplateStandardVO standardById 
                = attributeTemplateMapper.getStandardById(attributeTemplateUpdateDTO.getId());
        if (standardById == null) {
            //若为空,表示属性模板不存在,抛出异常不能删除
            String message = "修改失败, 试图访问的数据不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //若不为空,表示属性模板存在,可以进行下一步判断
        log.debug("属性模板存在,可以行下一步判断");
        //是: 存在, 判断修改的名字是否有重复
        int i = attributeTemplateMapper.countByName(attributeTemplateUpdateDTO.getName());
        if (i > 0) {
            //是: 有重复, 抛出异常, 修改失败
            String message = "属性模板名称已被占用, 修改失败";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //否: 名称未被占用, 可以修改
        AttributeTemplate attributeTemplate = new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateUpdateDTO, attributeTemplate);
        log.debug("名称未被占用, 可以修改, 参数:{}",attributeTemplate);
        i = attributeTemplateMapper.update(attributeTemplate);
        if (i != 1){
            String message = "修改失败, 服务器忙, 请稍后再试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public List<AttributeTemplateListVO> list() {
        log.debug("开始处理查询属性模板业务, 无参数");
        return attributeTemplateMapper.listAttTemVO();
    }

    @Override
    public AttributeTemplateStandardVO getStandardById(Long id) {
        log.debug("开始处理查询属性模板详情业务,参数:{}",id);
        AttributeTemplateStandardVO vo = attributeTemplateMapper.getStandardById(id);
        if (vo == null) {
            String message = "属性模板数据不存在,查询失败";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return vo;
    }
}
